package com.zlop.common.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.util.JxlsHelper;

/**
 * Excel工具类
 *
 * @author  曾令鹏
 * @since   jdk1.8
 * @version 2018年5月17日 曾令鹏
 */
public class JxlsUtils{
	
	/**
	 * 模板文件存放位置：classpath:/jxls-template/
	 */
	private static final String TEMPLATE_PATH="jxls-template";
	
	/**
	 * 导出Excel
	 * 
	 * @param is 指定指定模板文件流
	 * @param os 指定输出文件流
	 * @param model 数据模型
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException{
        Context context = new Context();
        if (model != null) {
            for (String key : model.keySet()) {
                context.putVar(key, model.get(key));
            }
        }
        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        Transformer transformer  = jxlsHelper.createTransformer(is, os);
        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
        Map<String, Object> funcs = new HashMap<String, Object>();
        funcs.put("utils", new JxlsUtils());    //添加自定义功能
        evaluator.getJexlEngine().setFunctions(funcs);
        jxlsHelper.processTemplate(context, transformer);
	}
	
	/**
	 * 导出Excel
	 * 
	 * @param xls 指定模板文件
	 * @param out 指定输出文件对象
	 * @param model 数据模型
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
    public static void exportExcel(File xls, File out, Map<String, Object> model) throws FileNotFoundException, IOException {
    	exportExcel(new FileInputStream(xls), new FileOutputStream(out), model);
    }
    
    /**
	 * 导出Excel
	 * 
	 * @param templateName 指定模板文件名称
	 * @param os 指定输出文件流
	 * @param model 数据模型
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
    public static void exportExcel(String templateName, OutputStream os, Map<String, Object> model) throws FileNotFoundException, IOException {
    	File template = getTemplate(templateName);
    	if(template!=null){
        	exportExcel(new FileInputStream(template), os, model);	
    	}
    }
    
    
    /**
     * 获取jxls模版文件
     * 
     * @param name 模板文件名称
     * @return 成功返回文件对象，失败返回null
     */
    public static File getTemplate(String name){
        String templatePath = JxlsUtils.class.getClassLoader().getResource(TEMPLATE_PATH).getPath();
        File template = new File(templatePath, name);
        if(template.exists()){
            return template;
        }
        return null;
    }	
	
    /**
     * 日期格式化
     * 
     * @param date 指定日期
     * @param fmt 指定格式
     * @return 成功返回格式化后的日期，失败返回空串
     */
    public String dateFmt(Date date, String fmt) {
        if (date == null) {
            return "";
        }
        try {
            SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);
            return dateFmt.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
    
    /**
     * 三目运算：b ? o1 : o2
     * 
     * @param b
     * @param o1
     * @param o2
     * @return 如果b为真，则返回o1，反之返回o2
     */
    public Object ifelse(boolean b, Object o1, Object o2) {
        return b ? o1 : o2;
    }
    
}
